/**
 * @file Motor.h
 * @author huangxiaozhu (huangxiaozhu@hxz.com)
 * @brief  电机的控制类。TODO:可以在此电机上实现更多的模拟控制，包括摩擦力的模拟。
 * @version 0.1
 * @date 2023-12-08
 * 
 * @copyright Copyright (c) 2023
 * 
 */

#pragma once
#include "Motor.h"
#include "DriverModule/BaseDriver.h"
#include "tools/ThreadObj/ThreadObj.h"
#include "tools/ThreadObj/ThreadCond.h"
#include <atomic>

/**
 * @brief 电机模拟控制类
 *        TODO: Motor继承ThreadObj，采用单线程的形式进行控制。
 *              后续如果模拟的场景比较复杂，可以不继承ThreadObj，才采用多线程进行处理模拟控制
 * 
 */
class Motor : public BaseDriver, public ThreadObj
{
public:
    Motor(const std::string& name = "");
    virtual ~Motor();

    virtual bool Init() override;

    virtual int DoTask() override;

    virtual void SetTargetSpeed(ushort rpm);
    virtual ushort GetCurrentSpeed();

private:
    // 主要是电机的转速
    std::atomic_ushort m_currentSpeed{0};               // 电机转速   转/每分钟
    std::atomic_ushort m_targetSpeed{0};                // 电机目标转速 转/每分钟

    int m_acc = 0;                                      // 模拟电机的控制加速度 
    int m_dec = 0;                                      // 模拟电机的控制减速度
private:
    // 配置模拟电机运行的控制参数，线程中控制
    bool m_beStop = false;                              // 工作线程是否启动。
    ThreadCond m_cond;                                  // 用于等待时间，同时提供退出的条件变量

};